"""
评论列表组件，用于显示直播评论
"""
from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QWidget, QHBoxLayout, QVBoxLayout, QLabel
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QFont, QColor

from app.ui.theme import Theme
from app.models.comment import Comment
from app.config.default_config import UI_COMMENT_LIST_MAX_ITEMS


class CommentItem(QWidget):
    """
    评论项组件
    """
    def __init__(self, comment: Comment, parent=None):
        """
        初始化评论项
        
        @param comment: 评论对象
        @param parent: 父组件
        """
        super().__init__(parent)
        self.comment = comment
        
        # 创建布局
        layout = QVBoxLayout(self)
        layout.setContentsMargins(8, 8, 8, 8)
        layout.setSpacing(4)
        
        # 创建用户信息布局
        user_layout = QHBoxLayout()
        user_layout.setSpacing(8)
        
        # 用户名标签
        self.user_name_label = QLabel(comment.user_name)
        self.user_name_label.setFont(Theme.get_font(bold=True))
        self.user_name_label.setStyleSheet(f"color: {Theme.get_color('text_primary')};")
        user_layout.addWidget(self.user_name_label)
        
        # 时间标签
        time_str = comment.timestamp.strftime("%H:%M:%S")
        self.time_label = QLabel(time_str)
        self.time_label.setFont(Theme.get_font(-1))
        self.time_label.setStyleSheet(f"color: {Theme.get_color('text_secondary')};")
        user_layout.addWidget(self.time_label)
        
        # 添加弹性空间
        user_layout.addStretch()
        
        # 平台标签 - 美化平台显示
        platform_name = comment.platform
        # 对特定平台进行友好显示
        if platform_name == "wechat_channel":
            platform_name = "视频号"
        elif platform_name == "websocket":
            platform_name = "直播间"
            
        self.platform_label = QLabel(platform_name)
        self.platform_label.setFont(Theme.get_font(-1))
        self.platform_label.setStyleSheet(f"color: {Theme.get_color('text_secondary')};")
        user_layout.addWidget(self.platform_label)
        
        # 添加用户信息布局
        layout.addLayout(user_layout)
        
        # 评论内容标签
        self.content_label = QLabel(comment.content)
        self.content_label.setWordWrap(True)
        self.content_label.setStyleSheet(f"color: {Theme.get_color('text_primary')};")
        layout.addWidget(self.content_label)
        
        # 设置样式
        self.setStyleSheet(f"""
            CommentItem {{
                background-color: {Theme.get_color('card_background')};
                border-radius: 4px;
                border: 1px solid {Theme.get_color('border')};
            }}
        """)


class CommentList(QListWidget):
    """
    评论列表组件
    """
    # 自定义信号
    commentSelected = pyqtSignal(Comment)
    
    def __init__(self, parent=None):
        """
        初始化评论列表
        
        @param parent: 父组件
        """
        super().__init__(parent)
        
        # 设置属性
        self.setVerticalScrollMode(QListWidget.ScrollPerPixel)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setSelectionMode(QListWidget.SingleSelection)
        
        # 连接信号
        self.itemClicked.connect(self._on_item_clicked)
        
        # 应用样式
        self.update_style()
    
    def update_style(self):
        """
        更新列表样式
        """
        self.setStyleSheet(f"""
            QListWidget {{
                background-color: {Theme.get_color('background')};
                border: 1px solid {Theme.get_color('border')};
                border-radius: 4px;
                padding: 4px;
            }}
            
            QListWidget::item {{
                padding: 2px;
                margin: 2px 0;
            }}
            
            QListWidget::item:selected {{
                background-color: {Theme.get_color('active')};
                border-radius: 4px;
            }}
            
            QListWidget::item:hover {{
                background-color: {Theme.get_color('hover')};
                border-radius: 4px;
            }}
        """)
    
    def add_comment(self, comment: Comment):
        """
        添加评论到列表
        
        @param comment: 评论对象
        """
        # 创建列表项
        item = QListWidgetItem(self)
        
        # 创建评论项组件
        comment_widget = CommentItem(comment)
        
        # 设置列表项大小
        item.setSizeHint(comment_widget.sizeHint())
        
        # 添加到列表
        self.addItem(item)
        self.setItemWidget(item, comment_widget)
        
        # 限制列表项数量
        while self.count() > UI_COMMENT_LIST_MAX_ITEMS:
            self.takeItem(0)
        
        # 滚动到底部
        self.scrollToBottom()
    
    def clear_comments(self):
        """
        清空评论列表
        """
        self.clear()
    
    def set_comments(self, comments: list):
        """
        设置评论列表
        
        @param comments: 评论列表
        """
        # 清空列表
        self.clear()
        
        # 添加评论
        for comment in comments:
            self.add_comment(comment)
    
    def _on_item_clicked(self, item):
        """
        列表项点击事件处理函数
        
        @param item: 点击的列表项
        """
        # 获取评论项组件
        comment_widget = self.itemWidget(item)
        
        # 发送评论选中信号
        if comment_widget:
            self.commentSelected.emit(comment_widget.comment) 